Usar Async y Await

Descripción

Como funcionan las palabras reservadas async y await.

Metodo

Tanto async como await, se utilizan para dar al código funcionalidades sincronas y asíncronas

El modificador async lo usaremos en funciones que queremos que se ejecuten de manera asíncrona en paralelo con otras funciones

El modificador await lo usaremos para esperar a que termine cierta funcion asíncrona antes de seguir ejecutando código.

Ejemplo:

public class Program
{
    public static async Task Main(String[] args)
    {
        Console.WriteLine("Inicio");
        Task procesoA = LanzarProcesoA();
        Task procesoB = LanzarProcesoB();

        await procesoA;
        await procesoB;
        Console.WriteLine("terminado");
    }

    private static async Task LanzarProcesoA()
    {
        Console.WriteLine("ProcesoA iniciando");
        await Task.Delay(5000);
        Console.WriteLine("ProcesoA terminado");

    }

    private static async Task LanzarProcesoB()
    {
        Console.WriteLine("ProcesoB iniciando");
        await Task.Delay(5500);
        Console.WriteLine("ProcesoB terminado");
    }
}

En el ejemplo anterior las funciones LanzarProcesoA y LanzarProcesoB están declaradas como async, por lo tanto se ejecutarán practicamente en paralelo, ya que se llaman desde la funcion principal una despues de la otra:

Dentro de cada función se lanza una subtarea que llama a Delay() y usamos await para esperar a que termine dicha subtarea, si no usasemos await en está linea la ejecución sería inmediata, ya que el delay se ejecutaría de manera asíncrona.

Al final de la función main llamamos a await para procesoA y procesoB, de está manera no aseguramos que ambas funciones terminen su ejecución antes de escribir el mensaje final.

Una cosa a tener en cuenta es que la ejecución del programa en total tarda algo mas de 5500 milisegundos, que es el delay del procesoB, esto nos indica que el procesoA y procesoB se ejecutan en paralelo, si no la ejecución del programa tardaría uno 10500 milisegundos

Tags

C# | Async | Await